home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 1996 June / Software of the Month Club 1996 June.iso / pc / dos / dtp / display / util / findjpg.c < prev    next >
C/C++ Source or Header  |  1996-01-06  |  2KB  |  102 lines

  1. /*
  2.   Find JFIF header in image
  3.   
  4.   Written by Jih-Shin Ho, 1995
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. #define DONT_CARE 0x100
  12. static short id[] = {0xff,0xd8,0xff,0xe0,DONT_CARE,DONT_CARE,
  13.                      'J','F','I','F'};
  14. static int num_id = sizeof(id) / sizeof(short);
  15.  
  16. #define CHUNK_SIZE (2 * 1024)
  17. static int data_stop;
  18. static unsigned char data[CHUNK_SIZE * 2];
  19. static unsigned char *current_data = data + CHUNK_SIZE;
  20. static int file_end;
  21. static FILE *text_inf;
  22.  
  23. #define GET_CHAR(from) (from < data_stop ? current_data[from] : fill_data(&from))
  24.  
  25. /*
  26.   For sequential reading only
  27. */
  28. static int fill_data(int *from)
  29. {
  30.   int read_size;
  31.   
  32.   if (file_end) return(EOF);
  33.   if (data_stop) memmove(data,current_data,CHUNK_SIZE);
  34.   read_size = fread(current_data,1,CHUNK_SIZE,text_inf);
  35.   if (read_size < CHUNK_SIZE) {
  36.     file_end = 1;
  37.     if (read_size < 0) read_size = 0;
  38.   }
  39.   if (read_size == 0) return(EOF);
  40.   *from -= data_stop;
  41.   data_stop = read_size;
  42.   return(current_data[*from]);
  43. }
  44.  
  45.  
  46. int main(int argc,char *argv[])
  47. {
  48.   int i,found,match_count,from;
  49.   FILE *in,*out;
  50.  
  51.   if (argc != 3) {
  52.     printf("\nUsage: findjpg input_file output_file\n\n");
  53.     return(1);
  54.   }
  55.   in = fopen(argv[1],"rb");
  56.   if (in == NULL) {
  57.     printf("Can't open %s\n",argv[1]);
  58.     return(1);
  59.   }
  60.   out = fopen(argv[2],"wb");
  61.   if (out == NULL) {
  62.     fclose(in);
  63.     printf("Can't open %s\n",argv[2]);
  64.     return(1);
  65.   }
  66.  
  67.   printf("Search JFIF header. Please wait ....\n");
  68.  
  69.   match_count = found = 0;
  70.   file_end = from = data_stop = 0;
  71.   text_inf = in;
  72.   while ((i = GET_CHAR(from)) != EOF) {
  73.     from++;
  74.     if (id[match_count] == DONT_CARE || i == id[match_count]) {
  75.       match_count++;
  76.       if (match_count == num_id) {
  77.         printf("JFIF header found.\n");
  78.         found = 1;
  79.         break;
  80.       }
  81.     }
  82.     else if (match_count) {
  83.       from -= match_count;
  84.       match_count = 0;
  85.     }
  86.   }
  87.  
  88.   if (found) {
  89.     printf("Write JFIF stream data to new file. Please wait ....\n");
  90.     from -= num_id;
  91.     while ((i = GET_CHAR(from)) != EOF) { putc(i,out); from++; }
  92.   }
  93.   fclose(in);
  94.   fclose(out);
  95.   if (found) printf("\nDone.\n");
  96.   else {
  97.     remove(argv[2]);
  98.     printf("\nJFIF header not found.\n");
  99.   }
  100.   return(0);
  101. }
  102.